# 廖雪峰的Python教程
# https://www.liaoxuefeng.com/wiki/1016959663602400/1017269965565856
# 5 python基础
# ====================================================================================================
# 5.1 数据类型和变量
# 如果字符串内部有很多换行，用\n写在一行里不好阅读，为了简化，Python允许用'''...'''的格式表示多行内容
# 不能用单引号和双引号,GPT解释已使用 /explain (重新运行而不使用):在 Python 中，三引号（''' 或 """）用于定义多行字符串。这种方式允许字符串跨越多行，而不需要使用换行符（\n）来手动分隔每一行。
print('''line1
line2
line3''')
# ====================================================================================================
# 5.2 字符串与编码
# 不同的编码方式
# str 和 bytes 的不同
# 为了保证使用utf-8编码，应该在文件开头加上这两行
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
# 第一行注释是为了告诉Linux/OS X系统，这是一个Python可执行程序，Windows系统会忽略这个注释；
# 第二行注释是为了告诉Python解释器，按照UTF-8编码读取源代码，否则，你在源代码中写的中文输出可能会有乱码。
# 格式化
# 占位符
# %d	整数
# %f	浮点数
# %s	字符串
# %x	十六进制整数
print('hello,%s,you have %d dolars.' % ('mike', 1000))  # 类似C的格式化输出
# 另外两种格式化方法:format()方法和f-string:自找麻烦不用
# 练习题 小明的成绩从去年的72分提升到了今年的85分，请计算小明成绩提升的百分点，并用字符串格式化显示出'xx.x%'，只保留小数点后1位：
print('%.1f' % ((85-72)/72))
print('提升了%.1f %%' % (((85-72)/72)))  # 用%%来表示输出一个%
# ====================================================================================================
# 5.3 使用list和tuple
# list
# len(list名称)函数可以获得list元素的个数
# 索引号从0开始正序，-1开始倒序
# append(带添加值)添加元素到末尾
# insert(索引号,待插入值)插入元素到指定位置
# pop()删除末尾元素
# pop(i)删除指定位置元素
list1 = [i for i in range(3)]
print(list1)
print(len(list1))
list1.append(3)
print(list1)
list1.insert(2, 'a')
print(list1)
list1.pop()
print(list1)
list1.pop(0)
print(list1)
# --------------------------------
# tuple
# tuple一旦初始化就不能修改
# 只有一个元素的tuple定义时必须加逗号,避免被当成()运算符
tuple1 = ()
tuple2 = (1,)
tuple3 = ('a', 'b', list1)
print(tuple1, tuple2, tuple3, sep='\n')
# tuple的不变是指指向不变，如果tuple中包含list，list的元素是可以变化的
tuple3[2].append('c')
list1.append('d')
print(tuple3)
list2 = [i for i in tuple3]
print(list2)
# ====================================================================================================
# 5.4 条件判断
# if condition:
#     do something
# elif condition:
#     do something
# else:
#     do something
# 练习
# 小明身高1.75，体重80.5kg。请根据BMI公式（体重除以身高的平方）帮小明计算他的BMI指数，并根据BMI指数：
# 低于18.5：过轻
# 18.5-25：正常
# 25-28：过重
# 28-32：肥胖
# 高于32：严重肥胖
height = float(input('请输入身高(m)：'))
weight = float(input('请输入体重(kg)：'))
bmi = weight/height**2
print('BIM指数为%.2f' % bmi)
if bmi < 18.5:
    print('过轻')
elif 18.5 <= bmi < 25:
    print('正常')
elif 25 <= bmi < 28:
    print('过重')
elif 28 <= bmi < 32:
    print('肥胖')
else:
    print('严重肥胖')
# ====================================================================================================
# 5.5 模式匹配
# match case
match bmi:
    case x if x < 18.5:
        print('过轻')
    case x if 18.5 <= x < 25:
        print('正常')
    case x if 25 <= x < 28:
        print('过重')
    case x if 28 <= x < 32:
        print('肥胖')
    case _:
        print('严重肥胖')
# 列表匹配
args = ['gcc', 'hello.c', 'world.c']
match args:
    case ['gcc']: print("只出现了gcc")
    case['gcc', file, *files]: print('出现了gcc且指定了文件')
    case['clean']: print('只出现了clean')
    case _: print('其他情况')
# 第二个case ['gcc', file1, *files]表示列表第一个字符串是'gcc'，第二个字符串绑定到变量file1，后面的任意个字符串绑定到*files（符号*的作用将在函数的参数中讲解），它实际上表示至少指定一个文件；
# ====================================================================================================
# 5.6 循环
# for循环
names = ['mike', 'jack', 'lucy']
for name in names:
    print(name)
numbers = [i for i in range(5)]
sum = 0
for x in numbers:
    sum += x
print(sum)
# while循环
# 练习：计算1-100所有奇数之和
sum = 0
i = 1
while i < 100:
    if (i % 2 != 0):
        sum += i
    i += 1
print(sum)
sum = 0
for i in range(1, 100):
    if (i % 2 != 0):
        sum += i
print(sum)
# ===================================================================================================
# 5.7 使用dict和set
# dict
# dict全称dictionary，在其他语言中也称为map，使用键-值（key-value）存储，具有极快的查找速度
# dict的key必须是不可变对象
d = {'mike': 95, 'jack': 80, 'lucy': 75}
print(d['mike'])
print('mike' in d)  # 一是通过in判断key是否存在：
print(d.get('mike'))  # 二是通过dict提供的get()方法，如果key不存在，可以返回None，或者自己指定的value
print(d.get('mike', -1))
# 删除一个键值对
print(d.pop('mike'))
print(d)
# set
# set和dict类似，也是一组key的集合，但不存储value。由于key不能重复，所以，在set中，没有重复的key。
# 创建一个set,也可以用列表创建
s1 = set([1, 2, 3])
s2 = {3, 4,}
s3 = s1 | s2  # et可以看成数学意义上的无序和无重复元素的集合，因此，两个set可以做数学意义上的交集、并集等操作：
print(s1, s2, s3, sep='\n')
# 添加元素
s1.add(5)
# 删除元素
s1.remove(1)
print(s1)
